from collections import Counter

import matplotlib.pyplot as plt
import pandas as pd
import re

from requests.compat import chardet

    # 读取csv文件


# 定义所有省份（包括自治区和直辖市）的列表
provinces = ['北京', '天津', '上海', '重庆', '河北', '山西', '辽宁', '吉林', '黑龙江',
             '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南',
             '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '宁夏回族',
             '新疆维吾尔', '西藏', '内蒙古', '广西壮族', '新疆', '香港', '广西']

"""绘制直方图"""

# 用于存储每个省份院士数量的列表
num_list = []

# 设置Matplotlib字体，确保可以正确显示中文
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # Windows上使用Microsoft YaHei字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 读取CSV文件并检测编码方式
with open('202231109院士统计表(Finally).csv', 'rb') as f:
    print("数据读取成功：")
    result = chardet.detect(f.read())  # 检测文件编码方式

print(result)  # 输出编码信息，帮助调试

# 使用检测到的编码方式读取CSV文件
df = pd.read_csv('202231109院士统计表(Finally).csv', encoding=result['encoding'])

#print(df)  # 输出读取的DataFrame，查看数据

# 获取CSV文件中第6列（假设第6列为出生地或省份信息）
# 索引从0开始，所以第6列的索引是5
fifth_column = df.iloc[:, 5]

# 判断第五列数据是否为空
if fifth_column.empty:
    print('数据为空')


def check_prefix_in_list( text, prefix_list):
    if type(text) == float:
        return 0
    # 获取前两个字
    prefix_two = text[:2]
    # 获取前三个字
    prefix_three = text[:3]
    # 判断前两个字或前三个字是否在列表中
    if prefix_two in prefix_list:
        return prefix_two
    elif prefix_three in prefix_list:
        return prefix_three
    else:
        return 0

# 遍历第五列的每个数据项，查找其是否属于省份列表
for sheng in fifth_column:


    result = check_prefix_in_list(sheng, provinces)  # 使用自定义的函数检查出生地是否是省份
    if result:  # 如果是省份，将该省份添加到num_list中
         num_list.append(result)

# 统计每个省份的院士数量，使用Counter类
birthplace_counts = Counter(num_list)

# 获取统计结果的省份和数量
provinces = list(birthplace_counts.keys())
counts = list(birthplace_counts.values())

# 使用Matplotlib绘制直方图
plt.figure(figsize=(10, 6))  # 设置图形大小
plt.bar(provinces, counts, color='skyblue')  # 绘制条形图，设置颜色为天蓝色
plt.xlabel('省份')  # 设置x轴标签
plt.ylabel('院士数量')  # 设置y轴标签
plt.title('各省院士分布数量')  # 设置图表标题
plt.xticks(rotation=45, ha='right')  # 设置x轴标签的角度，倾斜45度并调整对齐方式
plt.tight_layout()  # 调整布局，确保标签不被裁剪
plt.show()  # 显示图形


# print(datas)
#
#     # 获取出生地名称，用正则过滤
# company = []
# flag = 0
# for i in datas['出生地']:
#     flag += 1
#     if i is None:
#         continue
#     print("NO.",flag,i[:2])

    # # 获取公司收入
    # income = []
    # for i in datas['出生年月']:
    #     tmp = i.replace(',', '')
    #     income.append(float(tmp))
    # print(income)
    #
    # # 绘制直方图
    # index = company
    # plt.title("top10 company income", fontsize=18)
    # plt.xlabel('', fontsize=10)
    # plt.ylabel("income", fontsize=14)
    # plt.bar(index, income, label='income')
    # plt.xticks(rotation=50)
    # plt.legend()
    # plt.show()

